package com.zbf.JuLi;

import org.gavaghan.geodesy.Ellipsoid;
import org.gavaghan.geodesy.GeodeticCalculator;
import org.gavaghan.geodesy.GlobalCoordinates;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @author: LCG
 * @date: 2023-03-14 13:29:29
 * @description: 距离计算，计算两个经纬度点之间的直线距离
 **/
public class RangeComputer {

    /**
     * 根据经纬度，计算两点间的距离
     * @param longitudeFrom  第一个点的经度
     * @param latitudeFrom  第一个点的纬度
     * @param longitudeTo 第二个点的经度
     * @param latitudeTo  第二个点的纬度
     * @return 返回距离 单位米
     */
    public static double getDistance_m(String longitudeFrom, String latitudeFrom, String longitudeTo, String latitudeTo) {
        Double longgit1 = Double.valueOf(longitudeFrom);
        Double latitud1 = Double.valueOf(latitudeFrom);
        Double longgit2 = Double.valueOf(longitudeTo);
        Double latitud2 = Double.valueOf(latitudeTo);
        GlobalCoordinates source = new GlobalCoordinates(longgit1, latitud1);
        GlobalCoordinates target = new GlobalCoordinates(longgit2, latitud2);
        double ellipsoidalDistance = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.Sphere, source, target).getEllipsoidalDistance();
        BigDecimal bigDecimal=new BigDecimal(ellipsoidalDistance);
        BigDecimal bigDecimal1 = bigDecimal.setScale(1, RoundingMode.HALF_UP);
        return bigDecimal1.doubleValue();
    }

    /**
     * 根据经纬度，计算两点间的距离
     * @param longitudeFrom  第一个点的经度
     * @param latitudeFrom  第一个点的纬度
     * @param longitudeTo 第二个点的经度
     * @param latitudeTo  第二个点的纬度
     * @param accurate  保留小数点几位
     * @return 返回距离 单位千米
     */
    public static double getDistance_km(String longitudeFrom, String latitudeFrom, String longitudeTo, String latitudeTo,int accurate) {
        double distance = getDistance_m(longitudeFrom, latitudeFrom, longitudeTo, latitudeTo);
        if (accurate < 0) {
            throw new RuntimeException("精确度必须是正整数或零");
        }
        return new BigDecimal(distance).divide(new BigDecimal(1000),accurate, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    public static void main(String[] args) {
        double distance_m = getDistance_m("116.7178086", "39.564916", "116.7178086", "39.564916");
        System.out.println(distance_m);
    }
}
